/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file           : main.c
 * @brief          : Main program body
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2024 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
extern int tim0;
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
char show_cont = 1;
float number = 0;
uint16_t adc_buf[3];
uint16_t Temp[42] =
    {
        3266, 3104, 2950, 2806, 2668, 2540, 2418, 2302, 2192, 2088, 1990,
        1897, 1829, 1726, 1646, 1571, 1500, 1432, 1368, 1307, 1249,
        1194, 1142, 1092, 1045, 1000, 957, 916, 877, 848, 805,
        772, 740, 709, 680, 653, 626, 601, 577, 554, 532}; // 0~41

void Tem(uint16_t a)
{
    a = a * 1100 / (4096 - a); // 求温度电阻阻值
    for (char i = 0; i < 42; i++)
    {
        if ((Temp[i] - a) < 0)
        {
            if ((Temp[i - 1] - a) > (a - Temp[i]))
            {

                LCD_ShowIntNum(24, 54, i, 2, BRED, ~BLACK, 24);
                break;
            }
            else
            {
                LCD_ShowIntNum(24, 54, i - 1, 2, BRED, ~BLACK, 24);
                // printf("T:%d\r\n", i - 1);

                break;
            }
            break;
        }
    }
}
uint16_t cont = 0;
uint16_t cont1;

char i;
void Vote(uint16_t b)
{
    cont1 = (b * 2520 / 4096);
    for (i = 0; i < 10; i++)
    {
        cont += cont1;
        if (i == 9)
        {
            number = cont / 1000.0;
            // printf("%f\r\n", number);
            LCD_ShowFloatNum1(0, 0, number, 4, BRED, ~BLACK, 24);
            cont = 0;
        }
        HAL_Delay(10);
    }
}
uint16_t cur;
void Current(uint16_t a)
{
    cur = a * 600 / 4096;
    number = cur / 100.0;
    LCD_ShowFloatNum1(0, 28, number, 4, BRED, ~BLACK, 24);
    // LCD_ShowIntNum(24, 28, number, 4, BRED, ~BLACK, 24);
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    // printf("ADC %d, %d,  %d, \r\n", adc_buf[0], adc_buf[1], adc_buf[2]);
    // printf("r %d, \r\n",adc_buf[2]*1000/(4031-adc_buf[2]));
}

unsigned long Sys_Tim_100ms_Cnt = 0;
extern u16 Press_time0;
extern u16 Press_time1;
extern u16 Press_time2;
/* USER CODE END 0 */

/**
 * @brief  The application entry point.
 * @retval int
 */
int main(void)
{
    /* USER CODE BEGIN 1 */
    unsigned int main_tim = 0;
    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */
    extern Key_State KeyState;

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_ADC_Init();
    HAL_ADCEx_Calibration_Start(&hadc); // ad校准
    MX_TIM16_Init();
    HAL_TIM_Base_Start_IT(&htim16);
    MX_USART1_UART_Init();
    /* USER CODE BEGIN 2 */

    LCD_Init();
    LCD_Fill(0, 0, LCD_W, LCD_H, WHITE);                 // 背景 黑色
    LCD_ShowString(62, 10, "V", ~BRED, ~BLACK, 16, 0);   //  电压
    LCD_ShowString(62, 36, "A", GREEN, ~BLACK, 16, 0);   //  电流
    LCD_ShowString(0, 54, "T:", MAGENTA, ~BLACK, 24, 0); // 温度
    //----------------- LCD_Fill(0, 0, LCD_W, LCD_H, ~BLACK);

    extern unsigned char tt;
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */

        HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_buf, 3);

        // Tem((adc_buf[2] * 1000 / (4096 - adc_buf[2])));
        Tem(adc_buf[2]);
        Vote(adc_buf[1]);
        Current(adc_buf[0]);

        if (KeyState.K2_S_Flag)
        {
            KeyState.K2_S_Flag = 0;
            show_cont = !show_cont;
        }
        if (show_cont == 1)
        {
            LCD_BLK_Set();
        }
        if (show_cont == 0)
        {
            LCD_BLK_Clr();
        }

        // LCD_ShowIntNum(0, 0, 15, 2, BRED, ~BLACK, 24);
    }

    /* USER CODE END 3 */
}

/**
 * @brief System Clock Configuration
 * @retval None
 */
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

    /** Initializes the RCC Oscillators according to the specified parameters
     * in the RCC_OscInitTypeDef structure.
     */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI14;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.HSI14CalibrationValue = 16;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
    RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    /** Initializes the CPU, AHB and APB buses clocks
     */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
    {
        Error_Handler();
    }
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
        Error_Handler();
    }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
 * @brief  This function is executed in case of error occurrence.
 * @retval None
 */
void Error_Handler(void)
{
    /* USER CODE BEGIN Error_Handler_Debug */
    /* User can add his own implementation to report the HAL error return state
     */
    __disable_irq();
    while (1)
    {
    }
    /* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT
/**
 * @brief  Reports the name of the source file and the source line number
 *         where the assert_param error has occurred.
 * @param  file: pointer to the source file name
 * @param  line: assert_param error line source number
 * @retval None
 */
void assert_failed(uint8_t *file, uint32_t line)
{
    /* USER CODE BEGIN 6 */
    /* User can add his own implementation to report the file name and line
       number, ex: printf("Wrong parameters value: file %s on line %d\r\n",
       file, line) */
    /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
